package com.lsc.clientfacade;

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.lsc.model.Composant;

public class ClientFacade {
	
	private String url=null;
	private String charset="UTF-8";
	private boolean loggedIn=false;
	
	/**
	 * établit la session
	 * @param pUrl l'url du web service
	 * @param pUser le nom d'utilisateur
	 * @param pPass le mot de passe
	 * @return vrai si ok  faux sinon
	 */
	public boolean login(String pUrl, String pUser, String pPass){
		this.url=pUrl;
		boolean success=false;
		
		
		// on configure le gestionaire de cookies global , une fois pour toutes.
		CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
		
		//on prepare la partie query de la requete, on encodera les params avec le bon charset
		String query=null; 
		try {
			query="action=login&user="+URLEncoder.encode(pUser,charset)+"&pwd="+URLEncoder.encode(pPass,charset);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		//on envoie la requete
		
		try {
			URLConnection connection = new URL(url).openConnection();
			connection.setDoOutput(true); // configure la requete en POST.
			connection.setRequestProperty("Accept-Charset", charset);
			connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
			OutputStream output = null;
		    output = connection.getOutputStream();
		    output.write(query.getBytes(charset));
		    //la requête est effectivement envoyée des qu'on tente de récupérer la reponse
		    InputStream response = connection.getInputStream();
		    //prod code : WSResponse resp=new WSResponse(response);	
		    //debug code:
		    WSResponse resp=WSResponse.makeResponseDebug(response);
		    if (resp.getStatusCode().equals("0")){
		    	loggedIn=true;
		    	success=true;
		    }
		    response.close();
		} catch (IOException x) {
		     x.printStackTrace();
		}
		
		return success;
		
	}
	
	/**
	 * recupere sur le web service une liste de tous les composants
	 * on doit s'être loggué avant d'appeler cette méthode
	 * @return une liste de tous les composants
	 * @throws SessionNotLoggedInException 
	 */
	public List<Composant> getComposants() throws SessionNotLoggedInException{
		List<Composant> lc=null;
		if (!loggedIn){
			throw new SessionNotLoggedInException("cette methode doit être appelee dans le cadre d'une session établie");
		}
		
		//on prepare la partie query de la requete, on encodera les params avec le bon charset
		String query="action=getComposants";
				
		//on crée puis envoie la requete
		try {
				URLConnection connection = new URL(url).openConnection();
				connection.setDoOutput(true); // configure la requete en POST.
				connection.setRequestProperty("Accept-Charset", charset);
				connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
				OutputStream output = null;
			    output = connection.getOutputStream();
			    output.write(query.getBytes(charset));
			    //la requête est effectivement envoyée des qu'on tente de récupérer la reponse
			    InputStream response = connection.getInputStream();
			    //prod code : WSResponse resp=new WSResponse(response);	
			    //debug code:
			    WSResponse resp=WSResponse.makeResponseDebug(response);
			    response.close();
			    
			    
			    if (resp.getStatusCode().equals("1")){
			    	lc=new ArrayList<Composant>();
			    	Document dom=resp.getDom();
				    NodeList nl=dom.getElementsByTagName("composant");
				    for (int i=0; i<nl.getLength(); i++){
				    	Element e=(Element)nl.item(i);
				    	Composant c = new Composant();
				    	
				    	Element sousElt;
				    	sousElt=(Element) e.getElementsByTagName("idcomp").item(0);
				    	c.setId(sousElt.getTextContent());
				    	
				    	sousElt=(Element) e.getElementsByTagName("nomcomp").item(0);
				    	c.setNom(sousElt.getTextContent());
				    	
				    	sousElt=(Element) e.getElementsByTagName("desccomp").item(0);
				    	c.setDesc(sousElt.getTextContent());
				    	
				    	
				    	sousElt=(Element) e.getElementsByTagName("imgcomp").item(0);
				    	c.setImg(sousElt.getTextContent());
				    	
				    	sousElt=(Element) e.getElementsByTagName("qtestockcomp").item(0);
				    	c.setQteStock(Integer.parseInt(sousElt.getTextContent()));
				    					    					    	
				    	sousElt=(Element) e.getElementsByTagName("seuilalertecomp").item(0);
				    	c.setQteAlerte(Integer.parseInt(sousElt.getTextContent()));
				    	
				    	lc.add(c);
				    }
			    }
		} catch (IOException x) {
			     x.printStackTrace();
		}
		return lc;
	}
	
	
}
